Premier pas avec IPython et Jupyter deux couteaux suisse du développeur

K.I.A.Derouiche

Mars 24, 2018 Free Djelfa

Djelfa, Algerie

About me

  • Architect R&D at ADGON Solutions
  • Membre de l'association A2DMETI
  • GitHub

Contact

Qui utilisent Jupyter

Qui utilisent Jupyter

Introduction à IPython

Qui utilisent Jupyter

Le commencement !

créé par F Perez(Photo) (chercheur au Berkeley Institute for Data Science) en 2001.

Qui utilisent Jupyter

L'installation d'IPython, jupyter et jupyterlab

Trois méthodes d'installations:

  • installation de paquets via les distributions.
  • Utilisation de l'environement virtualenv via pip:
    • \$ pip install --user virtualenv
    • \$ virtualenv /path/vers/projet/env_nom_du_projet
    • \$ source /path/vers/projet/env_nom_du_projet/bin/activate
  • https://www.anaconda.com/ : Anaconda est une distribution open source pour des programmation Python et R permet de faire du traitement de données à grande échelle, l'analyse prédictive et l'informatique scientifique, visant à simplifier la gestion et le déploiement des paquets scientifique Python gérées par le système de gestion de paquets conda. un seul installeur pour tous les paquets Python scientifique,

Au commencement il eut IPython...

IPython un shell python évolué:

  • coloration syntaxique
  • autocompletation
  • historiques des saisies et des résultats
  • commandes systèmes
  • aide en ligne
  • commandes utiles propres (%magics)
  • intégration à la boucle d'évènement de divers toolkits graphiques(qt, gtk, wx)
  • pylab

Edition et évaluation de code python

Avec complétation automatique et coloration syntaxique.

IPython affiche le résultat de la derniére expression évaluée si elle ne vaut pas None

Les fonctions magiques et propres à IPython

  • commence avec % et %%
  • %quickref pour avoir tout les commandes
  • %lsmagic lister tous les commandes magiques

Available line magics: %alias %alias_magic %autocall %autoindent %automagic %bookmark %cat %cd %clear %colors %config %cp %cpaste %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %man %matplotlib %mkdir %more %mv %notebook %page %paste %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode

Available cell magics: %%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%js %%latex %%markdown %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile

Automagic is ON, % prefix IS NOT needed for line magics.

En lançant la commande IPython on travaille directement avec IPython, via stdin, stdout et stderr

Outer l'économie de ressources, cela permet de l'utiliser comme un shell systéme

Session IPython

In [ ]:
# Demarrer le logging de la session
%logstart
In [ ]:
#Etat de la session
%logstate
In [1]:
#Stoppé une session
%logoff
Logging hasn't been started yet (use logstart for that).

%logon/%logoff are for temporarily starting and stopping logging for a logfile
which already exists. But you must first start the logging process with
%logstart (optionally giving a logfile name).
In [ ]:
# Historique de la session
%history #or %hist
In [9]:
# Mesurer le temps d'exécution
S = [x**2 for x in range(10)]
%timeit M = [x for x in S if x % 2 == 0]
891 ns ± 31.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Exécution de commandes du shell

La commande shell commence par un point d'exclamation. Est la ligne est passé au shell du système

In [ ]:
# avec la commande **!**
In [3]: ! du -h /etc

Documentation en ligne

IPython propose une alternative commode à la commande help() de python avec la syntaxe ? On peut même consulter le code source (si présent) avec ??

In [11]:
import io
io.BytesIO?
Init signature: io.BytesIO(initial_bytes=b'')
Docstring:      Buffered I/O implementation using an in-memory bytes buffer.
Type:           type
In [2]:
## Je souhaite calculer pour la valeur x = 2.0 avec SymPy et NumPy
from IPython.display import display, Math, Latex
display(Math(r'y = \sqrt{log(1+x^{2})+\frac{x^{\sin(2\pi x)}}{\tanh(2.)}}'))
$$y = \sqrt{log(1+x^{2})+\frac{x^{\sin(2\pi x)}}{\tanh(2.)}}$$

puis vint le notebook

C'est une interface web interactive offrant toutes les commodités du shell

IPython avec un affichage riche(graphique et texte riche).

Qu'est ce que en trouve dans un notebook:

  • mettre en forme du texte avec markdown(et HTML)
  • insérer des formules mathématiques avec LaTeX
  • insérer et exécuter du code Python
  • insérer des images, vidéos
  • capturer les sorties matplotlib
  • and more...

Vite vite...Jupyter Notebook!

Jupyter process

Le projet jupyter

Depuis la version 4, le projet ipython à été divsé en :

  • Jupyter(notebook, console, qtconsole) - les interfaces
  • ipython(ipykernel) - le backend python
  • ipywidgets - éléments d'interfaces utilsateurs
  • ipyparalléle - framework d'exécution paralléle
  • traitlets - système de conf commun

Architecture de Jupyter

Jupyter process

IPython Architecture

Jupyter process

Des langages à volonté

IPython Kernel supporte plus de 50 langage de programmation utiliser et mélanger dans une même interface: Python, R, JavaScript, Ruby, Perl, C, Julia, Fortran, Matlab ou Mathematica, SQLite et SQL.

https://github.com/jupyter/jupyter/wiki/Jupyter-kernels

Interfaces

A premiére vue, le shell IPython et la console Jupyter sont identiques, ils ont les memes fonctionalités utilisateurs lancer:

  • \$ ipython console
  • \$ jupyter console

Cependant, la commande jupyter console:

  • lance deux processus: le noyau IPython + la console Jupyter(défaut)
  • ou permet de se connecter à un noyau existant, eventuellement distant(via ssh ou direct)

plusieurs consoles Jupyter peuvent partager le meme noyau

En lançant la commande ipython on travaille directement avec IPython, via stdin, stdout et stderr.

Outre l'économie de ressources, cela permet de l'utiliser comme un shell système

Services IPython

En mode console, on à accès à toutes les fonctionnalités du noyau IPython , à l'exception de l'affichage graphique riche des objets qui n'est exploitable qu'avec le Notebook(et dans une moindre mesure avec jupyter qtconsole)

Jupyter Console vs IPython console

JupyterLab QtConsole

A premiére vue, le shell IPython et la console Jupyter sont identiques, ils ont les memes fonctionnalités utilisateur.

Avec le notebook du Jupyter on a :

  • accés à tous les services noyau de IPython y compris l'affichage riche des objets
  • la possibilité d'inserer du texte formaté en markdown ou en LaTeX Le document ainsi crée est enrgesitré au format .ipynb qui est du json
  • les commandes magics commence avec (%%)dans la cellule notebook

Le document ainsi crée est enregistré au format .ipynb qui est au format JSON.

Démarrage et organisation de l'interface

Démonstration

  • lancement du serveur;
  • présentation de l'interface home;
  • ouverture et création d'un notebook;
  • changer le titre;
  • notion de cellule et markdown;
  • illustration complétation et documentation du notebook;
  • purger les sorties;
  • déplacer les cellules;
  • racourcis clavier.

Le format .ipynb

format

Lancement de Jupyter notebook en ligne de commande

Jupyter process

Réprésentation integration des objets riches

IPython offre la possiblité aux objets Python de définir des représentations autres que le simple

texte implementant des alternatives __repr__ (représentation d'un objet en mode ascii):

  • HTML (_reprhtml)
  • JSON (_reprjson)
  • PNG (_reprpng)
  • JPEG (_reprjpeg)
  • SVG (_reprsvg)
  • LaTeX (_reprlatex)
In [4]:
#Utilisation d'objet Python pour l'affichage
from IPython.display import Image
img = Image("images/logo_collage.png")
img
Out[4]:
In [12]:
print(img._repr_png_()[:100])
iVBORw0KGgoAAAANSUhEUgAABVYAAACaCAYAAABCKxN6AAFJ10lEQVR42uy9h1MUXRfue/6Fc2/dc2/dqlNffg1gzjkCEkRRQcRA
In [1]:
from IPython.display import Audio
song = Audio("./data/001_Debutant_CD1.mp3")
song
Out[1]:
In [8]:
print(song._repr_html_()[:200])
                <audio controls="controls" >
                    <source src="data:audio/mpeg;base64,SUQzAwAAAAAhdlRQRTIAAAAOAAAATWljaGVsIFRob21hc1RZRVIAAAAFAAAAMjAwN1RSQ0sAAAADAAAAMDFUUFVCAAAAHgAAAE
In [13]:
from IPython.display import YouTubeVideo
YouTubeVideo("8uWRVh58KdQ")
Out[13]:
In [9]:
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
 
x = np.linspace(0.1, 20, 200)
fig, axe = plt.subplots(figsize=(12, 8))
axe.plot(x, np.sin(x)/x)
Out[9]:
[<matplotlib.lines.Line2D at 0x7fb4a8122518>]
In [14]:
%matplotlib notebook
fig, axe = plt.subplots(figsize=(12, 8))
axe.plot(x, np.sin(x)/x)
Out[14]:
[<matplotlib.lines.Line2D at 0x7fb4a7f4c710>]

Analyse de donnée: Pandas

l’utilisation de la librairie Pandas rend la lecture de certains formats, le regroupement de données et quelques traitements statistiques trés simples.

In [2]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_excel('data/stock.xlsx')
df.head(3)
Out[2]:
VIN NUM ORDRE CODE MODEL ETAT ARRIVAGE LOCALISATION COULEUR
1 Z226722 7090339.0 0A02 R1200GS ADV NaN NaN NaN RACING RED MATT
2 Z721037 8430547.0 0J11 R NINET PURE PRODUIT PROTOTYPE NaN GRIS ALUMINUM
3 Z735434 8430548.0 0J21 R NINET RACER NaN PROTOTYPE SHOW-ROOM BLANC
In [3]:
df.isnull()
Out[3]:
VIN NUM ORDRE CODE MODEL ETAT ARRIVAGE LOCALISATION COULEUR
1 False False False False True True True False
2 False False False False False False True False
3 False False False False True False False False
4 False False False False False False False False
5 False False False False False False True False
6 False False False False False False False False
7 False False False False False False False False
8 False False False False False False False False
9 False False False False False True False False
10 False False False False False False True False
11 False False False False False False False False
12 False False False False False False True False
13 False False False False False False True False
14 False False False False True False True False
15 False False False False False True False False
16 False False False False False True True False
17 False False False False False True True False
18 True False False False False True True False
19 True True False False False True True False
20 False False False False False False True False
21 False False False False False False True False
22 False False False False False False True False
23 False False False False False False True False
24 False False False False False False True False
25 False False False False False False True False
26 False False False False False False True False
27 False False False False False False True False
28 False False False False False False True False
29 False False False False False False True False
30 False False False False False False True False
... ... ... ... ... ... ... ... ...
84 True False False False False True True False
85 True False False False False True True False
86 True False False False False True True False
87 True False False False False True True False
88 True False False False False True True False
89 True False False False False True True False
90 True False False False False True True False
91 True False False False False True True False
92 True False False False False True True False
93 True False False False False True True False
94 True False False False False True True False
95 True False False False False True True False
96 True False False False False True True False
97 True False False False False True True False
98 True False False False False True True False
99 True False False False False True True False
100 True False False False False True True False
101 True False False False False True True False
102 True False False False False True True False
103 True False False False False True True False
104 True False False False False True True False
105 True False False False False True True False
106 True False False False False True True False
107 True False False False False True True False
108 True False False False False True True False
109 True False False False False True True False
110 True False False False False True True False
111 True False False False False True True False
112 True False False False False True True False
113 True False False False False True True False

113 rows × 8 columns

Pandas charger un fichier csv

https://github.com/shantnu/Intro-to-Pandas

In [18]:
%matplotlib inline
data = pd.read_csv("./example/hubble_data.csv")
data.head()
  File "<ipython-input-18-11b5bd12e64d>", line 4
    [ressource](https://github.com/shantnu/Intro-to-Pandas)
                     ^
SyntaxError: invalid syntax
In [13]:
headers = ["dist","rec_vel"]
data_no_headers = pd.read_csv("./example/hubble_data_no_headers.csv", names = headers)
data_no_headers.head()
Out[13]:
dist rec_vel
0 0.032 170
1 0.034 290
2 0.214 -130
3 0.263 -70
4 0.275 -185

Selectionné d'une colonne

In [14]:
data_no_headers["dist"]
Out[14]:
0     0.032
1     0.034
2     0.214
3     0.263
4     0.275
5     0.275
6     0.450
7     0.500
8     0.500
9     0.630
10    0.800
11    0.900
12    0.900
13    0.900
14    0.900
15    1.000
16    1.100
17    1.100
18    1.400
19    1.700
20    2.000
21    2.000
22    2.000
23    2.000
Name: dist, dtype: float64

Jouer avec les index

In [ ]:
data.set_index("distance", inplace= True)
data.head()
In [15]:
data.plot()
plt.show()

Un autre exemple

In [17]:
data = pd.read_csv("./example/wages_hours.csv")
data.head()
Out[17]:
HRS RATE ERSP ERNO NEIN ASSET AGE DEP RACE SCHOOL
0 2157\t2.905\t1121\t291\t380\t7250\t38.5\t2.340...
1 2174\t2.970\t1128\t301\t398\t7744\t39.3\t2.335...
2 2062\t2.350\t1214\t326\t185\t3068\t40.1\t2.851...
3 2111\t2.511\t1203\t49\t117\t1632\t22.4\t1.159\...
4 2134\t2.791\t1013\t594\t730\t12710\t57.7\t1.22...

filter l'affichage

In [19]:
data = pd.read_csv("./example/wages_hours.csv", sep = "\t")
data.head()
Out[19]:
HRS RATE ERSP ERNO NEIN ASSET AGE DEP RACE SCHOOL
0 2157 2.905 1121 291 380 7250 38.5 2.340 32.1 10.5
1 2174 2.970 1128 301 398 7744 39.3 2.335 31.2 10.5
2 2062 2.350 1214 326 185 3068 40.1 2.851 * 8.9
3 2111 2.511 1203 49 117 1632 22.4 1.159 27.5 11.5
4 2134 2.791 1013 594 730 12710 57.7 1.229 32.5 8.8

l'âge par rapport au taux (salaire)

In [20]:
data2 = data[["AGE", "RATE"]]
data2.head()
Out[20]:
AGE RATE
0 38.5 2.905
1 39.3 2.970
2 40.1 2.350
3 22.4 2.511
4 57.7 2.791

trier par valeur

In [22]:
data_sorted = data2.sort_values(["AGE"])
data_sorted.head()
Out[22]:
AGE RATE
3 22.4 2.511
27 37.2 3.015
31 37.4 1.901
33 37.5 1.899
32 37.5 3.009

trier par index

In [23]:
data_sorted.set_index("AGE", inplace=True)
data_sorted.head()
Out[23]:
RATE
AGE
22.4 2.511
37.2 3.015
37.4 1.901
37.5 1.899
37.5 3.009

le taux augmente jusqu'à l'âge de 35 ans, puis il varie considérablement.

In [24]:
data_sorted.plot()
plt.show()

Calcul formel

In [35]:
from sympy import *
# Initialize notebook printing
init_printing()
integrate(x**2 * exp(x) * cos(x), x)
Out[35]:
$$\frac{x^{2} e^{x}}{2} \sin{\left (x \right )} + \frac{x^{2} e^{x}}{2} \cos{\left (x \right )} - x e^{x} \sin{\left (x \right )} + \frac{e^{x}}{2} \sin{\left (x \right )} - \frac{e^{x}}{2} \cos{\left (x \right )}$$
In [36]:
from sympy.integrals import laplace_transform
from sympy.abc import t, s, a
laplace_transform(t**a, t, s)
Out[36]:
$$\left ( \frac{s^{- a}}{s} \Gamma{\left(a + 1 \right)}, \quad 0, \quad - \Re{\left(a\right)} < 1\right )$$

Cellules de texte riche

Dans ces cellules on peut saisir du texte aves des balises de lise en forme:

  • Markdown
  • HTML
  • LaTeX

Démo (Texte Markdown)

IPywidgets

Une extension IPython pour ajouter encore plus d'interactivité à nos Notebooks.

IPywidgets

Les IPywidgets sont des éléments graphiques permettant de piloter des paramétres de fonctions

  • des zones de saisies
  • des cases à cocher
  • des curseurs
  • des menus déroulants

La clé réside dans la commande interact

In [27]:
from ipywidgets import interact

Premier exemple

In [28]:
from ipywidgets import *
from IPython.display import display
w = IntSlider()
display(w, w)

Deuxième exemple

In [29]:
def f(x):
    print(x)
interact(f, x=10)
Out[29]:
<function __main__.f>
In [30]:
interact(f, x=True) #Or False
Out[30]:
<function __main__.f>

valeur booléen

In [33]:
interact(f, x='text')
Out[33]:
<function __main__.f>
In [41]:
from ipywidgets import interact
t = np.arange(0.0, 1.0, 0.01)
x = np.linspace(0, 2*np.pi, 100)

def pltsin(f):
    plt.plot(x, sin(2*np.pi*t*f))
    plt.show()
interact(pltsin, f=(1, 10, 0.1))
t
Out[41]:
array([0.  , 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ,
       0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2 , 0.21,
       0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3 , 0.31, 0.32,
       0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4 , 0.41, 0.42, 0.43,
       0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5 , 0.51, 0.52, 0.53, 0.54,
       0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.61, 0.62, 0.63, 0.64, 0.65,
       0.66, 0.67, 0.68, 0.69, 0.7 , 0.71, 0.72, 0.73, 0.74, 0.75, 0.76,
       0.77, 0.78, 0.79, 0.8 , 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87,
       0.88, 0.89, 0.9 , 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98,
       0.99])

\$ pip install ipywidgets

\$ jupyter nbextension enable --py --sys-prefix widgetsnbextension

Un mot sur JupyterLab (l'environnement de développement web)

JupyterLab process

Quelques différences avec Jupyter

  • glisser-déposer pour réorganiser les cellules d’un notebook et les copier entre les notebooks.
  • l'affichage un moteur de rendu plus récent.
  • exécution des blocs de code de manière interactive à partir de fichiers texte (.py, .R, .md, .tex, etc.) ;
  • associer une console de code à un kernel de notebook pour explorer le code de manière interactive sans encombrer le notebook avec un travail temporaire ;
  • le tout en un, editeur JSON, console d'administration, composant web, notebooks un IDE scientifique intégéré avec une logique web
  • modifier les formats de fichiers populaires avec un aperçu en direct, tel que Markdown, JSON, CSV, Vega, VegaLite, et plus encore.

Démo

Les extensions de JupyterLab

JupyterLab dispose d'une option pour liste les extensions:

$ jupyterlab labextension list

Pour installer une extension pour jupyter

$ jupyter labextension install jupyterlab_voyager

jupyter labextension disable

jupyter labextension enable

https://jupyterlab.readthedocs.io/en/latest/developer/extension_dev.html

Interagir avec le Kernel

$ jupyter kernelspec list

Available kernels:

bash /home/kiad/.local/share/jupyter/kernels/bash

python3 /home/kiad/.local/share/jupyter/kernels/python3

octave /home/kiad/Atelier/EmulPy/share/jupyter/kernels/

scilab /home/kiad/Atelier/EmulPy/share/jupyter/kernels/scilab

coarray-fortran /usr/local/share/jupyter/kernels/coarray-fortran

python2 /usr/share/jupyter/kernels/python2

sagemath /usr/share/jupyter/kernels/sagemath

Conversion et publication

L'outil nbconvert est un outil en ligne de commandes qui permet de convertir les fichiers .ipynb dans un des formats supportés: HTML, PDF via LaTeX, diapositives(reveal.js), script, markdown, ReStructured Text.

jupyter nbconvert --to pdf votre_fichier.ipynb

jupyter nbconvert --to html --template base votre_fichier.ipynb

jupyter nbconvert slides.ipynb --to slides --post serve --ServePostProcessor.reveal_cdn="http://cdn.jsdelivr.net/reveal.js/2.5.0"

Démonstration

  • le notebook de cette présentation
  • les méta-données de cellule.

nbviewer Publication sur internet (Un livre écrit totalement avec Jupyter)

Coopération et partage

Avec d'autres utilisateurs de jupyter:

  • On peut facilement partager le notebook lui meme
    • par email
    • par répertoire partagé
    • dans le cloud
    • via un VCS privé ou github/bitbucket
  • Ou utiliser JupyterHub (https://github.com/jupyterhub/jupyterhub) dans une origanisation
In [ ]:
#  Questions?